package cn.common.utils;

import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SignatureException;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class JwtUtils {

    private static final String SECRET_KEY = "d70e9fa2df944593763eaa156424cd97d70e9fa2df944593763eaa156424cd97d70e9fa2df944593763eaa156424cd97"; // 至少 256 位
    public static final long EXPIRATION_TIME = 3600000; // 1小时有效期

    private static SecretKey getSigningKey() {
        byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
        return Keys.hmacShaKeyFor(keyBytes);
    }

    public static String generateToken(String user) {
        return Jwts.builder()
                .subject(user)
                .issuedAt(new Date(System.currentTimeMillis()))
                .expiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(getSigningKey())
                .compact();
    }

    public static String getUsernameFromToken(String token) {
        try {
            Jws<Claims> claimsJws = Jwts.parser()
                    .verifyWith(getSigningKey())
                    .build()
                    .parseSignedClaims(token);
            return claimsJws.getPayload().getSubject();
        } catch (SignatureException e) {
            // 处理签名验证失败的情况
            return null;
        }
    }

    public static boolean validateToken(String token) {
        try {
            Jwts.parser()
                    .verifyWith(getSigningKey())
                    .build()
                    .parseSignedClaims(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
//@Component // 添加@Component注解让Spring管理
//public class JwtUtils {
//
//    private static final String SECRET_KEY = "d70e9fa2df944593763eaa156424cd97d70e9fa2df944593763eaa156424cd97d70e9fa2df944593763eaa156424cd97"; // 你的256位密钥
//    public static final long EXPIRATION_TIME = 3600000; // 1小时
//    @Autowired
//    private  StringRedisTemplate redisTemplate;
//
//    // 关键：通过Setter注入静态字段
//    private  SecretKey getSigningKey() {
//        byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
//        return Keys.hmacShaKeyFor(keyBytes);
//    }
//
//    public  String generateToken(String username) {
//        long version = System.currentTimeMillis();
//
//        // 使用Redis存储版本号
//        redisTemplate.opsForValue().set(
//                "user:token_version:" + username,
//                String.valueOf(version),
//                EXPIRATION_TIME,
//                TimeUnit.MILLISECONDS
//        );
//
//        return Jwts.builder()
//                .subject(username)
//                .claim("ver", version)
//                .issuedAt(new Date())
//                .expiration(new Date(System.currentTimeMillis()  + EXPIRATION_TIME))
//                .signWith(getSigningKey())
//                .compact();
//    }
//
//    public  boolean validateToken(String token) {
//        try {
//            Claims claims = Jwts.parser()
//                    .verifyWith(getSigningKey())
//                    .build()
//                    .parseSignedClaims(token)
//                    .getPayload();
//
//            String currentVer = redisTemplate.opsForValue()
//                    .get("user:token_version:" + claims.getSubject());
//
//            return currentVer != null &&
//                    currentVer.equals(String.valueOf(claims.get("ver")));
//
//        } catch (Exception e) {
//            return false;
//        }
//    }
//
//    public  String getUsernameFromToken(String token) {
//        try {
//            return Jwts.parser()
//                    .verifyWith(getSigningKey())
//                    .build()
//                    .parseSignedClaims(token)
//                    .getPayload()
//                    .getSubject();
//        } catch (JwtException e) {
//            return null;
//        }
//    }
//
//    public  void invalidateTokens(String username) {
//        redisTemplate.delete("user:token_version:"  + username);
//    }
//}
